#include "adc1.h"

/************************************************************************
*函数名：ADC1_IN_Init
*函数功能：ADC1_IN通道初始化配置函数
*函数参数：无
*函数返回值：无
*函数说明：
*				ADC1_IN0——PA0——模拟模式
*				ADC1_IN1——PA1——模拟模式
*************************************************************************/
void ADC1_IN_Init(void)
{
	/*使能GPIOA时钟*/
	RCC->AHB1ENR |= (1<<0);//使能GPIOA时钟

	/*配置GPIO控制器*/
	//模式寄存器——模拟模式 11
	GPIOA->MODER &= ~	(3<<0*2);
	GPIOA->MODER |= 		(3<<0*2);//PA0配置为模拟模式
	GPIOA->MODER &= ~	(3<<1*2);
	GPIOA->MODER |= 		(3<<1*2);//PA1配置为模拟模式
}

/************************************************************************
*函数名：ADC1_Init
*函数功能：ADC1初始化配置函数
*函数参数：无
*函数返回值：无
*函数说明：
*************************************************************************/
void ADC1_Init(void)
{
	/*配置ADC1_IN通道*/
	ADC1_IN_Init();

	/*使能ADC1时钟*/
	RCC->APB2ENR |= (1<<8);

	/*配置ADC1控制器*/
	ADC->CCR 		&= ~	(3<<16);
	ADC->CCR 		|= 	(1<<16);//ADC预分频：4分频（21Mhz）。此分频所有ADC共用
	ADC->CCR 		&= ~	(0x1F<<0);//多重ADC模式：独立模式，所有ADC均独立
	ADC1->CR1 		&= ~	(3<<24);//分辨率：12位

#if SCAN_FLAG
	ADC1->CR1 		|=		(1<<8);//扫描模式：开启
#else
	ADC1->CR1		&= ~	(1<<8);//扫描模式：关闭
#endif

	ADC1->CR2	 	&= ~	(1<<11);//数据对齐：右对齐
	ADC1->CR2 		|= 	(1<<10);//结束转换选择：每个规则转换结束时将EOC位置1，使能溢出检测

#if CONT_FLAG
	ADC1->CR2		|=		(1<<1);//转换模式：连续转换
#else
	ADC1->CR2		&= ~	(1<<1);//转换模式：单次转换
#endif

	ADC1->SMPR2 	&= ~	(7<<0*3);//IN0采样时间：480个周期
	ADC1->SMPR2 &= ~	(7<<1*3);//IN1采样时间：480个周期
	ADC1->SQR1 	&= ~	(0xf<<20);
	ADC1->SQR1 	|= 	(1<<20);//规则通道序列长度：2（0001）

	ADC1->SQR3 	&= ~	(0x1f<<0*5);
	ADC1->SQR3 	|= 	(1<<0*5);//规则序列第一次转换：IN1
	ADC1->SQR3 	&= ~	(0x1f<<1*5);
	ADC1->SQR3 	|= 	(0<<1*5);//规则序列第二次转换：IN0

#if EOCIE_FLAG
	/*开启ADC中断*/
	//在CR1开启EOC中断
	ADC1->CR1 |= (1<<5);
	//设置中断优先级
	NVIC_SetPriority(ADC_IRQn,NVIC_EncodePriority(7-2,0,0));//给ADC设置优先级为(0,0)
	//使能中断源
	NVIC_EnableIRQ(ADC_IRQn);
	//开启规则转换
	ADC1->CR2 |= (1<<30);
#else
	ADC1->CR1 &= ~(1<<5);
#endif

	/*打开ADC1*/
	ADC1->CR2 	|= 	(1<<0);

	/*开启规则转换*/
	//ADC1->CR2 	|= 	(1<<30);
}

/************************************************************************
*函数名：ADC1_Getdata
*函数功能：获取规则转换结果
*函数参数：无
*函数返回值：无
*函数说明：
*************************************************************************/
u16 ADC1_Data[2] = {0,0};
void ADC1_Getdata(void)
{
	u8 i;
//	for (i = 0;i < 2;i++)
//	{
//		ADC1->CR2 |= 1<<30;//开启规则转换
//		while(!(ADC1->SR & (1<<1)));//等待转换完成（EOC位置1）
//		ADC1_Data[i] = ADC1->DR;//读取DR会将EOC位清零
//	}
	ADC1->SR &= ~(1<<0);
	ADC1->CR2 |= (1<<30);//开启规则转换
	while((ADC1->SR & (1<<1)) == 0);//卡在这条语句！！！！
	ADC1_Data[1] = ADC1->DR;//读取DR会将EOC位清零
	ADC1->SR &= ~(1<<0);

	printf("ADC1_Data[0] = %d\n",ADC1_Data[0]);
	printf("ADC1_Data[1] = %d\n",ADC1_Data[1]);
}

/************************************************************************
*函数名：ADC_IRQHandler
*函数功能：ADC中断服务函数
*函数参数：无
*函数返回值：无
*函数说明：
*************************************************************************/
void ADC_IRQHandler(void)
{
	static u8 i = 0;
	if (ADC1->SR & (1<<1))//如果规则通道转换结束（EOC）
	{
		ADC1->SR &= ~(1<<0);
		printf("aaa");
		ADC1_Data[i%2] = ADC1->DR;//读取DR会将EOC位清零
		i++;
	}
}
